package DAO;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import bean.*;
import Hibernate.HibernateUtil;
import Modelo.*;


public class ProveedorDAO {

	
	private static ProveedorDAO instancia = null;
	private static SessionFactory sf = null;

	public static ProveedorDAO getInstance() {
		if (instancia == null)
			instancia = new ProveedorDAO();
		return instancia;
	}
	
	protected ProveedorDAO (){
		super();
		sf = HibernateUtil.getSessionFactory();
	}

	public boolean existeProveedor(ProveedorTO p) {
		
		Session s = sf.openSession();
		String consulta = "SELECT p FROM Proveedor p WHERE p.cuit = (:cuit)";
		Query query = s.createQuery(consulta);
		query.setParameter("cuit", p.getCuit());
		
		Proveedor pro = (Proveedor) query.uniqueResult();
		
		return (pro==null);
	}

	public void altaCliente(ClienteTO nuevo) {
		Session s = sf.openSession();
		
		Cliente cl = new Cliente();
		cl.setActivo(true);
		cl.setCiudad(nuevo.getCiudad());
		cl.setCod_postal(nuevo.getCod_postal());
		cl.setCuit(nuevo.getCuit());
		cl.setDescuentoVip(nuevo.getDescuentoVip());
		cl.setDireccion(nuevo.getDireccion());
		cl.setFacturas(null);
		cl.setPais(nuevo.getPais());
		cl.setProvincia(nuevo.getProvincia());
		cl.setRazonSocial(nuevo.getRazonSocial());
		cl.setTelefono(nuevo.getTelefono());
		cl.setTipoCliente(nuevo.getTipoCliente());
		
		
		s.beginTransaction();
		s.persist(cl);
		s.getTransaction().commit();
		
	}

	public void modificarCliente(ClienteTO nuevo) {
		
		Session s = sf.openSession();
		
		//como hago para hacerlo con varios parametros?
		
		//String consulta = "UPDATE Cliente SET ciudad = (:ciu),  where odv.nroOficina = :nro ";
		
		
		//Query query = s.createQuery(consulta);
		//query.setParameter("cl", cuit);
		//query.setParameter("nro", nroOficina);
		
		//query.executeUpdate();
				
	}

	public void eliminarCliente(ClienteTO cto) {
		
		Session s = sf.openSession();
		
		String consulta = "UPDATE Cliente SET activo = false,  where cuit = :cl ";
		
		Query query = s.createQuery(consulta);
		query.setParameter("cl", cto.getCuit());
		
		//query.executeUpdate();
	}

	public Proveedor obtenerProveedor(ProveedorTO p) {
		
		Session s = sf.openSession();
		String consulta = "SELECT p FROM Proveedor p WHERE p.cuit = (:cuit)";
		Query query = s.createQuery(consulta);
		query.setParameter("cuit", p.getCuit());
		
		Proveedor pro = (Proveedor) query.uniqueResult();
		
		return pro;	
		
	}

	public void altaProveedor(ProveedorTO pto) {
		Session s = sf.openSession();
		
		Proveedor pr = new Proveedor();
		
		pr.setCiudad(pto.getCiudad());
		pr.setCod_postal(pto.getCod_postal());
		pr.setCondicionPago(null);
		pr.setCuit(pto.getCuit());
		pr.setDescuentoAdicional(pto.getDescuentoAdicional());
		pr.setDescuentoContado(pto.getDescuentoContado());
		pr.setDireccion(pto.getDireccion());
		pr.setListaPrecios(null);
		pr.setPais(pto.getPais());
		pr.setProvincia(pto.getProvincia());
		pr.setRazonSocial(pto.getRazonSocial());
		pr.setTelefono(pto.getTelefono());
		pr.setActivo(true);
		
		s.beginTransaction();
		s.persist(pr);
		s.getTransaction().commit();
	
	}

	public void eliminarProveedor(ProveedorTO p) {
		Session s = sf.openSession();
		
		String consulta = "UPDATE Proveedor SET activo = false,  where cuit = :pr ";
		
		Query query = s.createQuery(consulta);
		query.setParameter("pr", p.getCuit());
		
		query.executeUpdate();
		
	}

	public void modificarProveedor(ProveedorTO p) {
		
		//como hago para hacerlo con varios parametros?
		
		//String consulta = "UPDATE Proveedor SET   WHERE  ";
		
		
		//Query query = s.createQuery(consulta);
		//query.setParameter("cl", cuit);
		
		//query.executeUpdate();
		
	}

	public List<Proveedor> getProveedores() {
		Session s = sf.openSession();
		
		String consulta= "FROM Proveedor";
		
		Query query = s.createQuery(consulta);
		
		List<Proveedor> lis = query.list();
		
		return lis;
	}

	
}
